package org.activiti.designer.features;
import java.util.List;
import org.activiti.designer.ActivitiImageProvider;
import org.activiti.designer.eclipse.extension.ExtensionConstants;
import org.activiti.designer.integration.servicetask.CustomServiceTask;
import org.activiti.designer.property.extension.util.ExtensionUtil;
import org.activiti.designer.util.eclipse.ActivitiUiUtil;
import org.eclipse.bpmn2.Bpmn2Factory;
import org.eclipse.bpmn2.CustomProperty;
import org.eclipse.bpmn2.ServiceTask;
import org.eclipse.bpmn2.SubProcess;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.ICreateContext;
import org.eclipse.graphiti.mm.pictograms.Diagram;
public class CreateServiceTaskFeature extends AbstractCreateFastBPMNFeature {
public static final String FEATURE_ID_KEY = "servicetask";
private String customServiceTaskId;
public CreateServiceTaskFeature(IFeatureProvider fp) {
super(fp, "ServiceTask", "Add service task");
}
public CreateServiceTaskFeature(IFeatureProvider fp, String name, String description, String customServiceTaskId) {
super(fp, name, description);
this.customServiceTaskId = customServiceTaskId;
}
@Override
public boolean canCreate(ICreateContext context) {
Object parentObject = getBusinessObjectForPictogramElement(context.getTargetContainer());
return (context.getTargetContainer() instanceof Diagram || parentObject instanceof SubProcess);
}
@Override
public Object[] create(ICreateContext context) {
ServiceTask newServiceTask = Bpmn2Factory.eINSTANCE.createServiceTask();
newServiceTask.setId(getNextId());
setName("Service Task", newServiceTask, context);
// Process custom service tasks
if (this.customServiceTaskId != null) {
// Customize the name displayed by default
final List<CustomServiceTask> customServiceTasks = ExtensionUtil.getCustomServiceTasks(ActivitiUiUtil.getProjectFromDiagram(getDiagram()));
CustomServiceTask targetTask = null;
for (final CustomServiceTask customServiceTask : customServiceTasks) {
if (this.customServiceTaskId.equals(customServiceTask.getId())) {
targetTask = customServiceTask;
break;
}
}
if (targetTask != null) {
// Create custom property containing task name
CustomProperty customServiceTaskProperty = Bpmn2Factory.eINSTANCE.createCustomProperty();
customServiceTaskProperty.setId(ExtensionUtil.wrapCustomPropertyId(newServiceTask, ExtensionConstants.PROPERTY_ID_CUSTOM_SERVICE_TASK));
customServiceTaskProperty.setName(ExtensionConstants.PROPERTY_ID_CUSTOM_SERVICE_TASK);
customServiceTaskProperty.setSimpleValue(this.customServiceTaskId);
getDiagram().eResource().getContents().add(customServiceTaskProperty);
newServiceTask.getCustomProperties().add(customServiceTaskProperty);
newServiceTask.setImplementation(targetTask.getRuntimeClassname());
newServiceTask.setName(targetTask.getName());
}
}
Object parentObject = getBusinessObjectForPictogramElement(context.getTargetContainer());
if (parentObject instanceof SubProcess) {
((SubProcess) parentObject).getFlowElements().add(newServiceTask);
} else {
getDiagram().eResource().getContents().add(newServiceTask);
}
addGraphicalContent(newServiceTask, context);
return new Object[] { newServiceTask };
}
@Override
public String getCreateImageId() {
return ActivitiImageProvider.IMG_SERVICETASK;
}
@Override
protected String getFeatureIdKey() {
return FEATURE_ID_KEY;
}
@SuppressWarnings("rawtypes")
@Override
protected Class getFeatureClass() {
return Bpmn2Factory.eINSTANCE.createServiceTask().getClass();
}
}